package com.diy.sigmund.diycommon.designpatterns.template.beverage;

/**
 * 咖啡因饮料抽象类
 * <br>茶
 * <br>把水煮沸
 * <br>用沸水浸泡茶叶
 * <br>把茶倒进杯子
 * <br>加柠檬
 * <br>
 * <br>咖啡
 * <br>把水煮沸
 * <br>用沸水冲泡咖啡
 * <br>把咖啡倒进杯子
 * <br>加糖和牛奶
 * <br>
 * <br>泛化：咖啡因饮料
 * <br>把水煮沸
 * <br>冲泡
 * <br>把饮料倒进杯子
 * <br>加调料
 *
 * @author ylm-sigmund
 * @since 2022/2/10 10:14
 */
public abstract class CaffeineBeverage {

    /**
     * 如果一个类没有父类，Java在编译的时候会默认为你加上 extends Object
     * <br>Object是Java所有类型的根
     */
    public CaffeineBeverage() {
        super();
    }

    /**
     * final修饰符使子类无法继承
     * <br>被声明为final，以免子类改变这个算法的顺序
     */
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    /** 可以使用private，也可以使用final */
    protected final void boilWater() {
        System.out.println("Boiling water");
    }

    private void pourInCup() {
        System.out.println("Pouring into cup");
    }

    protected abstract void brew();

    protected abstract void addCondiments();


}
